|
Date : 10 Novembre 1991 Protection : ECRANS DE RAPPEL Programme : VGACOPY V3.2A Outils : SOFT-ICE V2.50 Fichier : FILLUP!.EXE et VGACOPY.COM Temps pass� : 3 HEURES Soci�t� : SHARWARE Divers : Incapable de reconnaitre une disquette 1.2Mo formatt�e en 730k ! Origine : L.F. Num�ro : 150 Deux programmes interessant l'un FILLUP! pour remplir les disquettes afin d'emp�cher un virus d'entrer et l'autre un copieur tous formats en VGA ! L'un et l'autre compact� "maison". Le compactage est relativement curieux: certaines instructions se retrouvent malgr� tout en "entier". C'est essentiellement le cas pour FILLUP! ce qui permet de le modifier relativement facilement: CS=0FAE CS:00E2 807EFF18 CMP BYTE PTR [BP-01],18 ; AFFICHE 18 LIGNES. CS:00E6 7584 JNZ 006C ; TANT QUE TOUT N'EST PAS AFFICHE. Avec PCTOOLS chercher 187584 et modifier 75 par 74. Pour VGACOPY on trouve le m�me type d'instructions avec le m�me test mais impossible de mettre en �vidence le saut dans le fichier. Une recherche en �criture de la valeur 74 avec SOFT-ICE me fait remonter une dizaine de niveaux jusqu'� ce que j'arrive � la chaine qui se trouve en clair dans le fichier. Mais comme il fallait s'y attendre une modification d'un octet se r�percute sur la suite du d�compactage et tout se plante. Ci-dessous les deux sauts � modifier ( 74 par EB ): 1)- 0FAE:2F01 80BEF8FC14 0FAE:2F06 7403 JNZ ; A REMPLACER PAR EB ( jmp ). 0FAE:2F08 E948FF CALL 2)- 0FAE:2FC9 80BEF9FC06 0FAE:2FCE 7403 JNZ ; A REMPLACER PAR EB ( jmp ) 0FAE:2FD0 E91CFE CALL Il ne reste plus qu'�: a) Mettre en �vidence l'INT la plus proche, il s'av�re que c'est l'INT 21 sous-fonction 47. b) Placer les adresses IP correspondantes: 2F06 et 2FCE. c) Puis lancer le gaufrier apocalyptique: ; PATCH POUR LE PROGRAMME VGACOPY.EXE ; DETOURNEMENT DE L'INT 21 SOUS-FONCTION 47 ; ;****************************************************************************** ; ZONE A INITIALISER adr_ip1 equ 2f06h ; mettre EB � la place de 74. adr_ip2 equ 2fceh ; .........idem.............. INT_DET equ 21h ; Le num�ro de l'INT que l'on veut utiliser. sous_fonction equ 47h ; Sous-fonction utilis�e. ;****************************************************************************** seg_a segment byte public assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a org 100h sto proc far start: jmp init ; r�duire la m�moire et d�placer la db 90h ; pile plus pr�s. nom_prg db 0ffh,0,0,0,0,0,0,0,0,0,0,0,0 ; 12 car max + nul paramet dw 0 ; M�me bloc d'environnement. ENVIR dw 0 ; Les param�tres de la ligne de data_3 dw 0 ; commande sont recopi�s ici puis FCB_1 dw 0 ; transmis au programme fils. ( 80h ) data_5 dw 0 ; "LOAD /U EGA 1" FCB_2 dw 0 data_7 dw 0 sauve_SP dw 0 sauve_SS dw 0 data_9 dw 0, 0 drap equ 0 ;------------------------------ PROGRAMME PERE ------------------------------ loc_1: mov sauve_SP,sp mov sauve_SS,ss mov ax,80h mov ENVIR,ax ; Ligne de commande... mov data_3,ds mov ax,5Ch ; Premier FCB ( inutilis� ) mov FCB_1,ax mov data_5,ds mov ax,6Ch ; Second FCB ( inutilis� ) mov FCB_2,ax mov data_7,ds mov ah,35h mov al,INT_DET int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov cs:data_9,bx mov word ptr cs:data_9+2,es mov ah,25h mov al,INT_DET lea dx,cs:[_int] ; Load effective addr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx lea dx,cs:[nom_prg] ; Load effective addr push ds pop es lea bx,cs:[paramet] ; Load effective addr mov al,0 mov ah,4Bh int 21h ; Appel du programme fils. ; run progm @ds:dx, parm @es:bx mov sp,sauve_SP mov ss,sauve_SS mov ah,25h mov al,INT_DET mov dx,cs:data_9 mov ds,word ptr cs:data_9+2 int 21h ; set intrpt vector al to ds:dx mov ah,4dh int 21h mov ah,4Ch int 21h ; terminate with al=return code sto endp ;---------------------------- int 16 d�tourn�e ----------------------------- int_entry proc far _int: push ax push ds push bp push cx pushf ; Push flags cmp byte ptr ds:[drap],1 ; Je regarde si c'est fait. jz loc_2 cmp ah,sous_fonction ; Sous - fonction de l'INT. jne loc_2 ; Jump if not equal mov ax,sp mov bp,ds mov cx,20 ; On pope 20 fois pour trouver incr: pop ds ; le bon segment. dec cx jz s cmp word ptr ds:[adr_ip1],0374h ; Si ok on patche. jnz incr ; Sinon on incr�mente. mov byte ptr ds:[adr_ip1],0ebh mov byte ptr ds:[adr_ip2],0ebh mov ds,bp mov byte ptr ds:[drap],1 ; On y revient plus. s: mov sp,ax loc_2: popf pop cx pop bp pop ds pop ax jmp dword ptr cs:data_9 int_entry endp ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------ init: mov ah,4ah mov bx,offset fin ; Fin du programme en BX. mov cl,4 ; Divis� par 4 pour avoir des paragraphes. shr bx,cl inc bx ; On en rajoute un par s�curit�. int 21h ; Execution de la fonction 4Ah. mov sp,offset fin ; on d�place la pile en "fin" car elle est jmp loc_1 ; plac�e en FFFE dans un programme COM. fin_init label near ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------ dw 47 dup (' ') db 65 dup ('*') db 40 dup (' '),'FREDDY_SOFT' db 44 dup (' '),65 dup ('*') fin equ this byte ; ici le sommet de la pile, SP seg_a ends end start Et �a marche. De plus j'ai r�ussi � lancer un programme fils invisible ! FREDDY |